
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    
    fprintf(stdout, "hello fprintf\n");

    const char *msg = "hello write\n";
    write(1, msg, strlen(msg));
    fork();
    return 0;
}













// #define LOG_NORMAL "logNormal.txt"
// #define LOG_ERROR "logError.txt"

// // 系统方案
// int main()
// {
//     int fd = open(LOG_NORMAL, O_CREAT | O_WRONLY | O_APPEND, 0666);
//     if (fd < 0)
//     {
//         perror("open");
//         return 1;
//     }

//     dup2(fd, 1);

//     printf("hello world,hello bit\n");
//     close(fd);

// 把错误代码和正确代码分开打印
//  close(1);
//  open(LOG_NORMAL,O_WRONLY | O_CREAT | O_APPEND, 0666);
//  close(2);
//  open(LOG_ERROR,O_WRONLY | O_CREAT | O_APPEND, 0666);
//  //C
//  printf("hello printf -> stdout\n");
//  printf("hello printf -> stdout\n");
//  printf("hello printf -> stdout\n");
//  printf("hello printf -> stdout\n");
//  printf("hello printf -> stdout\n");
//  fprintf(stdout,"hello fprintf -> stdout\n");
//  fprintf(stdout,"hello fprintf -> stdout\n");
//  fprintf(stdout,"hello fprintf -> stdout\n");
//  fprintf(stdout,"hello fprintf -> stdout\n");
//  fprintf(stdout,"hello fprintf -> stdout\n");

// fprintf(stderr,"hello fprintf -> stderr\n");
// fprintf(stderr,"hello fprintf -> stderr\n");
// fprintf(stderr,"hello fprintf -> stderr\n");
// fprintf(stderr,"hello fprintf -> stderr\n");
// fprintf(stderr,"hello fprintf -> stderr\n");

// printf("%d\n",stdin->_fileno);
// printf("%d\n",stdout->_fileno);
// printf("%d\n",stderr->_fileno);
// FILE *fd = fopen(LOG,"w");
// printf("%d\n",fd->_fileno);

// fclose(stdin);//close(0);
// close(0);
// close(2);
// close(1);
// close(0);
// close(1);
// // int fd = open(LOG,O_WRONLY | O_CREAT | O_TRUNC, 0666);//关闭1，输出重定向
// // int fd = open(LOG, O_RDONLY);//关闭0，输入重定向
// int fd = open(LOG,O_WRONLY | O_CREAT | O_APPEND, 0666);//关闭1，追加重定向

// // int a, b;
// // scanf("%d %d", &a, &b);
// // printf("a=%d , b=%d\n", a, b);

// printf("you can see me!\n");
// printf("you can see me!\n");
// printf("you can see me!\n");
// printf("you can see me!\n");
// printf("you can see me!\n");

// int fd1 = open(LOG,O_WRONLY | O_CREAT | O_TRUNC, 0666);
// int fd2 = open(LOG,O_WRONLY | O_CREAT | O_TRUNC, 0666);
// int fd3 = open(LOG,O_WRONLY | O_CREAT | O_TRUNC, 0666);
// int fd4 = open(LOG,O_WRONLY | O_CREAT | O_TRUNC, 0666);
// int fd5 = open(LOG,O_WRONLY | O_CREAT | O_TRUNC, 0666);
// int fd6 = open(LOG,O_WRONLY | O_CREAT | O_TRUNC, 0666);

// printf("%d\n",fd1);
// printf("%d\n",fd2);
// printf("%d\n",fd3);
// printf("%d\n",fd4);
// printf("%d\n",fd5);
// printf("%d\n",fd6);

// umask(0); // 把权限设置为0
// // int fd = open(LOG, O_WRONLY | O_CREAT, 0666); // 以写的方式创建或打开文件，权限设置为666
// // int fd = open(LOG, O_WRONLY | O_CREAT | O_TRUNC, 0666);//清空上次的，写入
// // int fd = open(LOG, O_WRONLY | O_CREAT | O_APPEND, 0666);//追加
// int fd = open(LOG, O_RDONLY);
// if (fd == -1)
// {
//     printf("fd: %d, errno: %d, errstring %s\n", fd, errno, strerror(errno));
// }
// else
//     printf("fd: %d, errno: %d, errstring %s\n", fd, errno, strerror(errno));

// // printf("fd: %d\n",fd);

// //读
// char buffer[1024];
// //这里我们无法做到按行读取，我们是整体读取的
// ssize_t n = read(fd,buffer,sizeof(buffer)-1);//使用系统接口来进行IO的时候，一定要注意\0问题
// if(n>0)
// {
//     buffer[n]='\0';
//     printf("%s\n",buffer);
// }

// 写
//  const char *msg = "aaaaaaaaaa";
//  int cnt = 1;
//  while (cnt)
//  {
//      char line[128];
//      snprintf(line, sizeof(line), "%s, %d\n", msg, cnt);
//      write(fd, line, strlen(line)); // 不用加1，因为\0是C语言的规定，不是文件的规定
//      cnt--;
//  }

// close(fd);
// return 0;
// }

// 语言方案
//  #include <stdio.h>

// #define LOG "log.txt"

// int main()
// {
//     // w:默认写方式打开文件，如果文件不存在，就创建它
//     // 默认如果只是打开，文件内容会自动被清空
//     // 同时，每次进行写入的时候，都会从最开始进行写入
//     // FILE *fp = fopen(LOG, "w");

//     // a:不会清空文件，而是每一次写入都是从文件结尾写入的，追加
//     // FILE *fp = fopen(LOG, "a");
//     FILE *fp = fopen(LOG, "r");
//     if (fp == NULL)
//     {
//         perror("fopen");
//         return 1;
//     }

//     while(1)
//     {
//         char line[128];
//         if (fgets(line, sizeof(line), fp) == NULL)
//             break;
//         else
//             printf("%s", line);
//     }

//     // // const char *msg = "hello bite, hello 107";
//     // const char*msg="aaa\n";
//     // int cnt = 5;
//     // while (cnt)
//     // {
//     //     fputs(msg,fp);
//     //     // char buffer[256];
//     //     // snprintf(buffer,sizeof(buffer),"%s: %d:hxj\n",msg,cnt);
//     //     // fputs(buffer,fp);//格到缓冲区里，再打印到文件里
//     //     // printf("%s",buffer);//格到缓冲区里，再打印出来

//     //     // fprintf(fp, "%s: %d: hxj\n", msg, cnt);//向文件写

//     //     // fprintf(stdout, "%s: %d: hxj\n", msg, cnt);//向显示器写
//     //     // fputs(msg,fp);
//     //     cnt--;
//     // }

//     fclose(fp);
//     return 0;
// }